package com.ruoyi.sync;

import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

/**
 * 注解@Async的方法不是public方法；
 * 注解@Async的返回值只能为void或Future；
 * 注解@Async方法使用static修饰也会失效；
 * 没加@EnableAsync注解；
 * 调用方和@Async不能在一个类中；
 * 在Async方法上标注@Transactional是没用的，但在Async方法调用的方法上标注@Transcational是有效的；
 */
@RestController
@RequestMapping({"/async"})
public class AsyncController {
    @Autowired
    private AsyncService asyncService;
    // 假设有多个不同的线程池
    @Autowired
    @Qualifier("taskExecutor")
    private Executor executor;

    public static void main(String[] args) {
        new AsyncController().async();
    }

    //异步接口实现
    @RequestMapping({"/test"})
    public AjaxResult async() {
        CompletableFuture.runAsync(() -> {
            // 这里执行你的异步操作
            orderPay();
        },executor);
        System.out.println("async");
        return AjaxResult.success();
    }

    @RequestMapping({"/test1"})
    //异步接口实现
    public AjaxResult async1() {
        asyncService.orderPay1();
        System.out.println("test1");
        return AjaxResult.success();
    }

    public void orderPay() {
        try {
            Thread.sleep(5000);
            System.out.println("orderPay");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
